<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>日志文件维护</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="routine-reindex.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="maintenance.html">快退</a></td><td width="60%" align="center" valign="bottom">章22. 日常数据库维护工作</td><td width="10%" align="right" valign="top"><a href="maintenance.html">快进</a></td><td width="10%" align="right" valign="top"><a href="backup.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="LOGFILE-MAINTENANCE">22.3. 日志文件维护</a></h1><a name="AEN24760"></a>
<p>把数据库服务器的日志输出保存在一个地方而不是仅仅把它们放到 <tt class="FILENAME">/dev/null</tt> 里是个好主意。在碰到危险的时候，日志输出是非常宝贵的。不过，日志输出可能很庞大(特别是在比较高的调试级别上)，而且你不会无休止地保存它们。你需要"滚动"日志文件，这样生成新的日志文件并且经常抛弃老的。</p>
<p>如果你简单地把 <tt class="COMMAND">postgres</tt> 的 <span class="SYSTEMITEM">stderr</span> 重定向到一个文件中，你会有日志输出，但是截断日志文件的唯一的方法是停止并重启主服务器。这样做对于开发环境中是可以的，但是你肯定不想在生产环境中也这么干。</p>
<p>一个更好的办法是把主服务器的 <span class="SYSTEMITEM">stderr</span> 输出发送到某种日志滚动程序里。我们有一个内置的日志滚动程序，你可以通过在 <tt class="FILENAME">postgresql.conf</tt> 里设置配置参数 <tt class="LITERAL">redirect_stderr</tt> 为 <tt class="LITERAL">true</tt> 的办法打开它。这个程序的控制参数在<a href="runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHERE">节17.7.1</a>里描述。</p>
<p>另外，如果你想使用一个外部日志滚动程序(比如 Apache 附带的 <span class="APPLICATION">rotatelogs</span> 工具)，你可以将 <span class="SYSTEMITEM">stderr</span> 的输出重定向到这个外部工具。如果你用 <tt class="COMMAND">pg_ctl</tt> 启动服务器，那么 <span class="SYSTEMITEM">stderr</span> 已经重定向到 <span class="SYSTEMITEM">stdout</span> ，因此你只需要一个管道命令，比如：</p>
<pre class="PROGRAMLISTING">pg_ctl start | rotatelogs /var/log/pgsql_log 86400</pre>
<p>另外一种生产级的管理日志输出的方法就是把它们发送给 <span class="APPLICATION">syslog</span> 处理滚动。要利用这个工具，我们需要设置 <tt class="FILENAME">postgresql.conf</tt> 里的 <tt class="LITERAL">log_destination</tt> 为 <tt class="LITERAL">syslog</tt>(记录 <span class="APPLICATION">syslog</span> 日志)。然后在你想强迫 <span class="APPLICATION">syslog</span> 守护进程开始写入一个新日志文件的时候，就可以发送一个 <tt class="LITERAL">SIGHUP</tt> 信号给它。如果你想自动滚动日志文件，那么我们可以配置 <span class="APPLICATION">logrotate</span> 程序处理 <span class="APPLICATION">syslog</span> 的日志文件。</p>
<p>不过，在很多系统上，<span class="APPLICATION">syslog</span> 不是非常可靠，特别是在大型日志信息的情况下；它可能在你最需要那些信息的时候截断或者丢弃它们。还有，在 linux 上，<span class="APPLICATION">syslog</span> 会把每个消息刷新到磁盘上，导致很低下的性能。你可以在 <span class="APPLICATION">syslog</span> 配置文件里面的文件名开头使用 <tt class="LITERAL">-</tt> 来关闭这个行为。</p>
<p>请注意上面描述的所有解决方案关注的是在可配置的间隔上开始一个新的日志文件，它们并没有删除不再需要的旧日志文件。你可能还需要设置一个批处理，周期地删除旧日志文件。另外一个可能的解法是配置日志滚动程序，让它周期地覆盖旧的日志文件。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="routine-reindex.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="backup.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">经常重建索引</td><td width="34%" align="center" valign="top"><a href="maintenance.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">备份与恢复</td></tr>
</table>
</div>
</body></html>